# 导入flask内置的模块
from flask import session,render_template,current_app,jsonify,request
# 从news/init中导入news_blus
from info.tulis.response_code import RET
from . import news_blue
# 导入user模型类
from info.models import User,Category,News
# 导入常量
from info import constants



@news_blue.route('/')
def index():
    # # 状态保持
    # session['itcast'] = '1998'
    # return render_template('news/index.html')
    '''
    项目首页数据极加载
        一：检查用户的登录状态：
        1.如果用户登录了，显示用户名信息，负则提供登录注册入口
        2.使用session对象，从redis中获取user_id
        3.根据user_id,查询mysql，获取用户信息
        4.传给模板
        二：新闻分类数据加载
        查询mysql，获取新闻分类数据
        三：点击排行
        查询数据库，获取新闻点击排行

    :return:
    '''
    # 使用请求上下文对象，获取user_id
    user_id = session.get('user_id')
    user = None
    # 查询mysql，获取用户信息
    try:
        user = User.query.get(user_id)
    except Exception as e:
        current_app.logger.error(e)

    # 新闻分类数据加载
    try:
        categories = Category.query.all()
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR,errmsg='查询新闻分类数据失败')
    # 判断查询结果
    if not categories:
        return jsonify(errno=RET.NODATA,errmsg='无新闻分类数据')
    # 定义列表，用来储藏遍历后的新闻分类数据
    categories_list = []
    # 遍历查询结果，调用模型类中to_dict函数，获取数据
    for categories in categories:
        categories_list.append(categories.to_dict())

    # 查询新闻数据排行
    try:
        news_list = News.query.order_by(News.clicks.desc()).limit(constants.CLICK_RANK_MAX_NEWS)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR,errmsg='查询新闻点击排行数据失败')
    # 判断查询结果
    if not news_list:
        return jsonify(errno=RET.NODATA,errmsg='无新闻点击排行')
    # 定义列表，储藏查询结果
    news_click_list = []
    for news in news_list:
        news_click_list.append(news.to_dict())


    # 定义字典，用来储存返回模板的数据
    data = {
        'user_info':user.to_dict() if user else None,
        'categories_list':categories_list,
        'news_click_list':news_click_list
    }

    return render_template('news/index.html',data=data)

@news_blue.route('/new_list')
def get_news_list():
    '''
    1.获取参数，ajax发送get请求cid，page，per_page
    2.检查参数，把cid，page，per_page转换成int类型
    3.判断分类id：查询所有新闻
    4.获取分页后的新闻列表，总页数，当前页数
    5.定义容量，遍历新闻列表
    6.返回总页数，当前页数，新闻列表

    :return:
    '''

    # 获取参数
    cid = request.args.get('cid','1')
    page = request.args.get('page','1')
    par_page = request.args.get('par_page','10')
    # 转换数据类型
    try:
        cid,page,par_page = int(cid),int(page),int(par_page)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.PARAMERR,errmsg='参数数据类型错误')
    # 判断新闻分类，如果不是最新，添加到过滤条件的列表中
    filters = []
    if cid > 1:
        filters.append(News.category_id == cid)
    # 根据filter过滤条件查询数据库
    try:
        paginate = News.query.filter(*filters).order_by(News.create_time.desc()).paginate(page,par_page,False)
    except Exception as e:
        current_app.logger(e)
        return jsonify(errno=RET.DBERR,errmsg='查询新闻列表数据失败')
        # 获取分页后的数据

        news_list = paginate.items
        current_page = paginate.page
        total_page = paginate.pages
        # 定义容器，储藏分页新闻列表数据
        news_dict_list = []
        for news in news_list:
            news_dict_list.append(news.to_dict())
        # 定义字典
        data = {
            'news_dict_list':news_dict_list,
            'current_page':current_page,
            'total_page':total_page
        }




# 加载logo图标
# favicon.ico 游览器会默认请求项目路径下的favicon
@news_blue.route('/favicon.ico')
def favicon():
    return current_app.send_static_file('news/favicon.ico')